#水浒传
import jieba
import csv
import pstats
import profile
class NameCount():
    def getNameTimesSort(self, name_list, txt_path):
        mydict = ['及时雨','黑旋风', '行者','豹子头','花和尚', '智多星',  '玉麒麟', '神行太保', '小李广','九纹龙','青面兽', '高太尉','鼓上蚤']
        for item in mydict:
            jieba.add_word(item)
        txt = open(txt_path, "r", encoding='utf-8').read()
        bieming = [['及时雨', '宋江', '呼保义', '孝义黑三郎', '宋公明', '宋押司'],['黑旋风', '李逵', '铁牛'],['武松', '武二郎', '行者', '武行者', '武都头'],['豹子头', '林冲', '林教头'],
                   ['鲁提辖', '鲁达', '智深', '花和尚', '鲁智深'],['智多星', '吴用', '吴学究', '吴加亮', '赛诸葛', '加亮先生'],['卢俊义', '玉麒麟', '卢员外'], ['戴宗','戴院长','神行太保'],['花荣', '花知寨', '小李广'],
                   ['九纹龙', '史进'], ['杨志', '杨制使', '杨提辖', '青面兽'], ['高俅，‘高二','高太尉'],['时迁','鼓上蚤'] ]
        words = jieba.lcut(txt)
        counts = {}
        for word in words:
            if len(word) == 1:
                continue
            else:
                counts[word] = counts.get(word, 0) + 1
        # 计算出场次数（各个别名的合计次数）
        lst = list()
        for i in range(13):
            lt = 0
            for item in bieming[i]:
                lt += counts.get(item, 0)
            lst.append(lt)
        items = list()
        for i in range(13):
            items.append([name_list[i], lst[i]])
        items.sort(key=lambda x: x[1], reverse=True)
        f = open('水浒传人物统计.csv', 'w', newline='', encoding='utf-8')
        csv_writer = csv.writer(f)
        csv_writer.writerow(['水浒传人物统计'])
        csv_writer.writerow(["姓名", "出现次数"])
        for i in range(13):
            word, count = items[i]
            print("{0:<10}{1:>5}".format(word, count))
            csv_writer.writerow([word, count])
        f.close()
        return items
if __name__ == '__main__':

    # 参与统计的人名列表，可修改成自己想要的列表
    name_list = ['宋江', '鲁智深', '花荣', '武松', '吴用', '高俅', '史进', '卢俊义', '李逵', '林冲',  '杨志','戴宗','时迁']
    # 水浒传txt文件所在路径
    txt_path = 'D:\shz.txt'
    NameCount().getNameTimesSort(name_list, txt_path)
    print("效能测试：")
    profile.run('NameCount()', "result")
    # 直接把分析结果打印到控制台
    p = pstats.Stats('result')  # 创建Stats对象
    p.strip_dirs().sort_stats("call").print_stats()  # 按照调用的次数排序
    p.strip_dirs().sort_stats("cumulative").print_stats()  # 按执行时间次数排序
